#pragma once

#include "logger.h"
#include <nlohmann/json.hpp>
#define KV_OK                                       0
#define KV_ERR                                      1

#define DE_BUG 1
#define F_DE_BUG 1
#define G_DE_BUG 1
#define SERVER_ADD "127.0.0.1"
#define SERVER_PORT 8001
#define MAX_THREAD_NUMBER   1024

enum class State
{
    None = 0,
    Leader = 1,    // 领导
    Candidate = 2, // 候选人
    Follower = 3,   // 跟随者
};
enum class RequestType
{
    AppendEntriesArgs = 0, // 追加条目 about log
    AppendEntriesReply = 1, // 追加条目回复
    VoteArgs = 2,           // 投票 about election
    VoteReply = 3,          // 投票回复
};

// 请求投票
struct VoteArgs // 参数
{
    int term = 0;            // 候选人的任期
    int candidate_id = 0;    // 候选人的id
    int last_log_index = -1; // 候选人最新log的index
    int last_log_term = 0;   // 候选人最新log的任期
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(VoteArgs, term, candidate_id, last_log_index, last_log_term)
};
struct VoteReply
{
    int term = 0;              // 返回的任期
    bool vote_granted = false; // 是否投票
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(VoteReply, term, vote_granted)
};

 // 追加条目（可作心跳）
struct AppendEntriesArgs
{
    int term = 0;             // 领导的任期
    int leader_id = 0;        // 领导的id
    int pre_log_index = 0;    // 跟随者的同步进度索引
    int pre_log_term = 0;     // 跟随者的同步进度任期
    int commit_index = 0;     // 领导的最新提交索引
    std::vector<Log> log_vec; // 要同步的日志

     // 使用nlohmann库的宏定义来自动生成序列化和反序列化函数
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(AppendEntriesArgs, term, leader_id, pre_log_index, pre_log_term, commit_index, log_vec)
};
struct AppendEntriesReply
{
    int id = 0;           // 返回的id
    int term = 0;         // 返回的任期
    int log_count = 0;    // 要同步的日志数量
    bool success = false; // 是否同步成功
    int commit_index = 0; // 返回的最新提交索引
         // 使用nlohmann库的宏定义来自动生成序列化和反序列化函数
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(AppendEntriesReply, id, term, log_count, success, commit_index)
};

